/*
	filename:		CCardRegion.cpp
	author:			Rico Roberto Zu�iga
	last modified:	9/12/03

	description:	Card region data structure subs.
*/
#include <iostream>
#include "gui/CCardRegion.h"

using namespace CardGraphics;

QPixmap* CCardRegion::deck=NULL;
QSize CCardRegion::cardSize;

CardGraphics::CardDrawList CCardRegion::getDrawList() {
  CardGraphics::CardDrawList drawList;
  if (!(attributes & CardGraphics::StackVisible)) {
    Query::debugOut("Stack is invisible. Returning empty draw list\n",3);
    return drawList;
  }
  bool is3d = attributes & CardGraphics::Stack3d;
  bool isFaceUp = attributes & CardGraphics::StackFaceUp;
  if (!cardStack->Size() && (symbol != CardGraphics::NoSymbol)) {
    Query::debugOut("Putting empty stack's symbol in the draw list.\n",3);
    QRect symbolImageArea(QPoint((CARDBACKLOC+symbol)*CARDWIDTH,0), cardSize);
    QPixmap symbol = deck->copy(symbolImageArea);
    drawList << CardDrawInfo(QRect(position, cardSize), symbol);
  }
  else {
    Query::debugOut("Building card stack's draw list.\n",3);
    CONST_VI vi = cardStack->begin();
    QPoint cardPos = position;
    int i=0;
    int index=CARDBACKLOC;
    while (vi != cardStack->end()) {
      if (isFaceUp)
        index = getDeckIndex(vi->GetIndex());

      QRect cardImageArea(QPoint(index*CARDWIDTH,0), cardSize);
      QPixmap card = deck->copy(cardImageArea);
      drawList << CardDrawInfo(QRect(cardPos, cardSize), card);
      vi++;
      i++;
      if (!is3d || i%factorFor3d == 0) {
        cardPos.rx() += offset.width();
        cardPos.ry() += offset.height();
      }
    }
  }

  return drawList;
}

int CCardRegion::getDeckIndex(int cardIndex) {
  cardIndex -= 1;
  int suit = cardIndex / 13;
  int rank = cardIndex % 13 + 1;
  if (rank > 12)
    rank = 0;
  return suit*13 + rank;
}


// void CCardRegion::DrawCardStack()
// {
// 	DrawCardStack(NULL);
// }
//
// void CCardRegion::DrawCardStack(SDL_Surface *s)
// {
// 	if(!(attributes & CardGraphics::StackVisible))
// 		return;
//
//
// 	DrawSymbol(xCoord, yCoord, Symbol);
// 	for(VI vi = cardStack.begin(); vi != cardStack.end(); ++vi)
// 	{
// 		if(vi->FaceUp())
// 			DrawCard(vi->x, vi->y, vi->Idx, s);
// 		else
// 			DrawCardBack(vi->x, vi->y, s);
// 	}
// }
//
//     void        Reverse()             { cardStack.Reverse();  }
//
//     void        Push(CCard card)          { cardStack.Push(card); }
//     void        Push(CCardStack cs)         { cardStack.Push(cs);   }
//
//     void    AddJokers(int jokers)       { cardStack.AddJokers(jokers); }
//
// /*
// void CCardRegion::AnimateStack()
// {
// 	for(VI vi = cardStack.begin(); vi != cardStack.end(); ++vi)
// 	{
// 		if(AnimateCard(*vi) == -1)
// 			return;
// 	}
// }
// */
// void CCardRegion::InitCardCoords()
// {
// 	if(cardStack.Empty())
// 		return;
//
// 	int x = xCoord;
// 	int y = yCoord;
//
// 	int pos = 0;
// 	int it = 0;
//
// 	if(Attributes&CRD_3D)
// 	{
// 		for(VI vi = cardStack.begin(); vi != cardStack.end(); ++vi)
// 		{
// 			vi->SetCardLoc(x, y);
// 			if( !((it++)%4) )
// 				pos++;
// 			x = (pos*2)+xCoord;
// 			y = pos+yCoord;
// 		}
// 	}
//
// 	else
// 	{
// 		for(VI vi = cardStack.begin(); vi != cardStack.end(); ++vi)
// 		{
// 			vi->SetCardLoc(x, y);
// 			x += xOffset;
// 			y += yOffset;
// 		}
// 	}
// }
// //__________________________________________________________
// /*                                                          |
// |  Imperfect, doesn't work well with diagonal, reversed,    |
// |  and 3d stacks... Needs tweaking                          |
// |_________________________________________________________*/
//
// bool CCardRegion::PtInStack(int x, int y)
// {
// 	if(!(Attributes&CRD_VISIBLE))
// 		return false;
//
// 	if(Attributes&CRD_3D && !this->Empty())
// 		return cardStack[cardStack.Size()-1].PtInCard(x, y);
//
// 	int StackWidth = this->GetStackWidth();
// 	int StackHeight = this->GetStackHeight();
//
// 	if(x >= xCoord && x <= xCoord + StackWidth && y >= yCoord && y <= yCoord + StackHeight)
// 		return true;
// 	else
// 		return false;
// }
//
// bool CCardRegion::PtOnTop(int x, int y)
// {
// 	if(this->Empty())
// 		return false;
//
//     return cardStack[cardStack.Size()-1].PtInCard(x, y);
// }
//
// int CCardRegion::GetOverlapRatio(int x, int y, int w, int h)
// {
// 	if(!(Attributes&CRD_DODROP))
// 		return 0;
//
// 	int StackWidth = this->GetStackWidth();
// 	int StackHeight = this->GetStackHeight();
//
// 	int wi, hi;
//
// /*
//  _______________________________
// |                               |
// |            _______            |
// |           |       |           |
// |           |       |           |
// |___________|_______|___________|
//             |       |
//             |_______|
// */
// 	if( PtInStack(x, y) )
// 	{
// 		if(xCoord + StackWidth > x + w)
// 			wi = w;
// 		else
// 			wi = (xCoord + StackWidth) - x;
//
// 		hi = (yCoord + StackHeight) - y;
// 	}
// /*
//      _______________________________
//     |                               |
//  ___|___                            |
// |   |   |                           |
// |   |   |                           |
// |   |___|___________________________|
// |       |
// |_______|
// */
// 	else if( PtInStack(x + w, y))
// 	{
// 		wi = (x + w) - xCoord;
// 		hi = (yCoord + StackHeight) - y;
// 	}
// /*
//              _______
//             |       |
//  ___________|_______|___________
// |           |       |           |
// |           |       |           |
// |           |_______|           |
// |                               |
// |_______________________________|
// */
// 	else if( PtInStack(x, y + h) )
// 	{
// 		if(xCoord + StackWidth > x + w)
// 			wi = w;
// 		else
// 			wi = (xCoord + StackWidth) - x;
//
// 		hi = (y + h) - yCoord;
// 	}
// /*
//  _______
// |       |
// |    ___|___________________________
// |   |   |                           |
// |   |   |                           |
// |___|___|                           |
//     |                               |
//     |_______________________________|
// */
// 	else if( PtInStack(x + w, y + h))
// 	{
// 		wi = (x + w) - xCoord;
// 		hi = (y + h) - yCoord;
// 	}
// /*
//  _______________________________
// |                               |
// |                               |
// |                               |
// |                               |
// |_______________________________|
// */
// 	else
// 		return 0;
//
// 	return wi * hi;
//
// }

// bool CCardRegion::CanDrop(const CCardStack& dropStack)
// {
//   if (!(attributes & CardGraphics::StackDrop))
//     return false;
//
//   VI stackCard = cardStack.begin();
//   if (!cardStack.Empty()) {
//     stackCard = cardStack.end() -1;
//     if (stackCard->FaceDown())
//       return false;
//   }
//
//   if (dropReqs == CardGraphics::NoReqs)
//     return true;
//
//   if ((dropReqs & CardGraphics::ReqSingleCard) && (dropStack.Size() > 1) )
//   {
//     return false;
//   }
//
//   CONST_VI dropCard = dropStack.begin();
//
//   if ((dropReqs & CardGraphics::ReqKing) && (dropCard->Rank() != 13))
//     return false;
//   if ((dropReqs & CardGraphics::ReqAce) && (dropCard->Rank() != 1))
//    return false;
//
//   if ((dropReqs & CardGraphics::ReqRed) && !dropCard->IsRed())
//     return false;
//   if ((dropReqs & CardGraphics::ReqBlack) && !dropCard->IsBlack())
//     return false;
//
//   if (cardStack.Empty())
//     return true;
//
//   if ((dropReqs & CardGraphics::ReqOppColor) &&
//       ( (stackCard->IsBlack() && !dropCard->IsRed()) ||
//         (stackCard->IsRed() && !dropCard->IsBlack()) ))
//     return false;
//
//   if ((dropReqs & CardGraphics::ReqNotLower) &&
//       (dropCard->Rank() < stackCard->Rank()))
//     return false;
//   if ((dropReqs & CardGraphics::ReqNotHigher) &&
//       (dropCard->Rank() > stackCard->Rank()))
//     return false;
//   if ((dropReqs & CardGraphics::ReqNotEqual) &&
//       (dropCard->Rank() == stackCard->Rank()))
//     return false;
//
//   if ((dropReqs & CardGraphics::ReqAdjacent) &&
//       (abs(dropCard->Rank() - stackCard->Rank()) != 1))
//     return false;
//
//   if ((dropReqs & CardGraphics::ReqSameSuit) &&
//       (dropCard->Suit() != stackCard->Suit()))
//     return false;
//
// 	return true;
// }

// int CCardRegion::GetStackWidth()
// {
// 	if(cardStack.Empty())
// 		return CARDWIDTH;
//
// 	return (cardStack[cardStack.Size()-1].x + CARDWIDTH) - cardStack[0].x;
// //	return CARDWIDTH + ( (this->Size()-1) * xOffset );
// }

// int CCardRegion::GetStackHeight()
// {
// 	if(cardStack.Empty())
// 		return CARDHEIGHT;
//
// 	return (cardStack[cardStack.Size()-1].y + CARDHEIGHT) - cardStack[0].y;
// //	return CARDHEIGHT + ( (this->Size()-1) * yOffset );
// }

